Оптимизация отображения ссылочных значений

Событие ПриВыводеСтроки() используется табличным полем для оформления ячеек каждой строки данных. При обработке данного события можно изменить цвет фона или текста ячейки, шрифт, которым отображается текст в ячейке, а также установить картинку или флажок в ячейке. Также существует возможность замены текста, отображаемого в ячейке, на какой-либо другой.

Обработчик события ПриВыводеСтроки() вызывается табличным полем в следующих случаях:

  1. Обновление данных, отображаемых табличным полем. Например, при обработке команды "Обновить" контекстного меню табличного поля или после окончания редактирования строки.
  2. Поиск по подстроке. В некоторых случаях (например, при поиске по колонке, не связанной с данными) поиск осуществляется табличным полем. В этом случае обработчик события ПриВыводеСтроки() вызывается для каждой строки между текущей и искомой.

Процесс вызова обработчика события ПриВыводеСтроки() имеет ряд особенностей. Так, представления ссылочных значений получаются при первом обращении к свойствам объекта ОформлениеЯчейки из встроенного языка. При этом, если текст ячейки, содержащей ссылочное значение, будет устанавливаться (например, через метод УстановитьТекст() или через свойство Текст объекта ОформлениеЯчейки), то представление ссылочного значения получаться не будет, а будет сразу заменено на новый текст. После окончания обработки события ПриВыводеСтроки() представления остальных ссылочных значений (к которым не было обращения из встроенного языка)  будут также получены.

В случае поиска по подстроке по определенной колонке есть еще одно отличие - получаются представления колонки поиска и всех колонок, к которым было обращение в событии ПриВыводеСтроки(). Представления остальных ссылочных значений не получаются. Тем самым, обработка события ПриВыводеСтроки() при поиске происходит быстрее.

При получении представлений ссылочных значений для табличного поля,  если не используется динамический список, выполняется обращение к базе данных. Для оптимизации отображения  табличного поля отображающего считанные данные (непример, таблицы значений) можно использовать следующий метод:

  1. При заполнении источника данных табличного поля получать отдельно и ссылочные значения и их строковые представления.
  2. При обработке события ПриВыводеСтроки для ячеек колонки, отображающей ссылочные значения, устанавливать в качестве текста полученное строковое представление.

Поясним использование данного метода на следующем примере. Пусть существует форма подбора номенклатуры, на которой расположено табличное поле, отображающее таблицу значений. Строками таблицы значений являются ссылки на элементы списка справочника Номенклатура. Единственная колонка "Наименование" табличного поля связана с колонкой "Ссылка" таблицы значений. Заполнение таблицы значений происходит в результате выполнения запроса, причем группы списка справочника не получаются. Требуется осуществлять подбор номенклатуры из данного табличного поля.

В начале необходимо заполнить таблицу значений. Для этого в обработчике события ПередОткрытием() формы выполняется запрос, результатом которого является таблица значений, содержащая ссылки и строковые представления элементов справочника Номенклатура:

Копировать в буфер обмена
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

    Перем Запрос;

    РежимВыбора = Истина;
    ЗакрыватьПриВыборе = Ложь;

    // Получение списка элементов справочника Номенклатура 
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                    | Номенклатура.Ссылка,
                    | Номенклатура.Представление
                    |ИЗ
                    | Справочник.Номенклатура КАК Номенклатура
                    |
                    |ГДЕ
                    | (Номенклатура.ЭтоГруппа = ЛОЖЬ)";

    // Установка полученной таблицы значений в качестве источника данных 
    ЭлементыФормы.Список.Значение = Запрос.Выполнить().Выгрузить();

КонецПроцедуры

Для того чтобы при обновлении табличного поля не получались строковые представления ссылочных значений, необходимо при обработке события ПриВыводеСтроки() устанавливать ячейке, отображающей ссылочное значение, полученное строковое представление:

Копировать в буфер обмена
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

    ОформлениеСтроки.Ячейки.Наименование.УстановитьТекст(ДанныеСтроки.Представление);

КонецПроцедуры

Подбор элементов справочника Номенклатура осуществляется при обработке события Выбор() табличного поля:

Копировать в буфер обмена
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)

    ОповеститьОВыборе(ВыбраннаяСтрока.Ссылка);

    СтандартнаяОбработка = Ложь;

КонецПроцедуры

Необходимо заметить, что использование данного метода также положительно скажется на работе быстрого поиска в табличном поле, т.к. при поиске не будут получаться представления ссылочных значений.